package com.zenithmind.version.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.common.result.PageResult;
import com.zenithmind.version.pojo.dto.RepositoryCreateDTO;
import com.zenithmind.version.pojo.domain.Repository;
import com.zenithmind.version.pojo.vo.RepositoryVO;
import com.zenithmind.version.mapper.RepositoryMapper.RepositoryStatistics;

import java.util.List;

/**
 * 仓库服务接口
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface RepositoryService extends IService<Repository> {

    /**
     * 创建仓库
     * 
     * @param createDTO 创建DTO
     * @return 仓库VO
     */
    RepositoryVO createRepository(RepositoryCreateDTO createDTO);

    /**
     * 分页查询仓库列表
     * 
     * @param current 当前页
     * @param size 页大小
     * @param ownerId 所有者ID
     * @param type 仓库类型
     * @param status 仓库状态
     * @param keyword 关键词
     * @return 分页结果
     */
    PageResult<RepositoryVO> getRepositoryPage(Long current, Long size,
                                              String ownerId, Integer type,
                                              Integer status, String keyword);

    /**
     * 根据ID查询仓库详情
     * 
     * @param id 仓库ID
     * @return 仓库VO
     */
    RepositoryVO getRepositoryById(String id);

    /**
     * 根据名称和所有者查询仓库
     * 
     * @param name 仓库名称
     * @param ownerId 所有者ID
     * @return 仓库VO
     */
    RepositoryVO getRepositoryByNameAndOwner(String name, String ownerId);

    /**
     * 更新仓库信息
     * 
     * @param id 仓库ID
     * @param updateDTO 更新DTO
     * @return 是否成功
     */
    Boolean updateRepository(String id, RepositoryCreateDTO updateDTO);

    /**
     * 删除仓库
     * 
     * @param id 仓库ID
     * @return 是否成功
     */
    Boolean deleteRepository(String id);

    /**
     * 归档仓库
     * 
     * @param id 仓库ID
     * @return 是否成功
     */
    Boolean archiveRepository(String id);

    /**
     * 取消归档仓库
     * 
     * @param id 仓库ID
     * @return 是否成功
     */
    Boolean unarchiveRepository(String id);

    /**
     * Fork仓库
     * 
     * @param id 源仓库ID
     * @param name 新仓库名称
     * @return 新仓库VO
     */
    RepositoryVO forkRepository(String id, String name);

    /**
     * 查询用户的仓库列表
     * 
     * @param userId 用户ID
     * @param type 仓库类型
     * @return 仓库列表
     */
    List<RepositoryVO> getUserRepositories(String userId, Integer type);

    /**
     * 查询公开仓库列表
     * 
     * @param keyword 关键词
     * @param language 编程语言
     * @param limit 限制数量
     * @return 仓库列表
     */
    List<RepositoryVO> getPublicRepositories(String keyword, String language, Integer limit);

    /**
     * 更新仓库统计信息
     * 
     * @param repositoryId 仓库ID
     * @return 是否成功
     */
    Boolean updateRepositoryStatistics(String repositoryId);

    /**
     * 检查仓库名称是否可用
     * 
     * @param name 仓库名称
     * @param ownerId 所有者ID
     * @return 是否可用
     */
    Boolean checkRepositoryNameAvailable(String name, String ownerId);

    /**
     * 获取仓库克隆URL
     * 
     * @param id 仓库ID
     * @param protocol 协议类型（http/ssh）
     * @return 克隆URL
     */
    String getCloneUrl(String id, String protocol);

    /**
     * 初始化仓库
     *
     * @param repositoryId 仓库ID
     * @param initReadme 是否初始化README
     * @param initGitignore 是否初始化.gitignore
     * @param gitignoreTemplate .gitignore模板
     * @param initLicense 是否初始化LICENSE
     * @param licenseTemplate LICENSE模板
     * @return 是否成功
     */
    Boolean initializeRepository(String repositoryId, Boolean initReadme,
                                Boolean initGitignore, String gitignoreTemplate,
                                Boolean initLicense, String licenseTemplate);

    /**
     * 获取仓库统计信息
     *
     * @param ownerId 所有者ID
     * @return 统计信息
     */
    RepositoryStatistics getRepositoryStatistics(String ownerId);
}
